package com.huluobo.lib_base

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import okhttp3.OkHttpClient
import okhttp3.Request
import java.io.File

/**
 *  Created by LC on 2025/6/12.
 */
object DownloadUtils {
    fun download(url: String, file: File): Flow<UIState> {
        return flow {
            //构建一个请求
            val request = Request.Builder().url(url).get().build()

            //使用OkHttp发起请求,并产生返回
            val response = OkHttpClient.Builder().build().newCall(request).execute()

            //当请求成功时
            if (response.isSuccessful) {
                //获取返回的body
                response.body.let { body ->
                    //通过文件产生输出流
                    file.outputStream().let { os ->
                        //获取body中的字节流
                        val bs = body?.byteStream()
                        //声明字节流的长度
                        var len = 0
                        //声明一个字节数组,并且有默认的缓冲区大小
                        val byteArray = ByteArray(DEFAULT_BUFFER_SIZE)

                        //while循环,判断条件
                        //当len =it 字节下标给len赋值的时候,如果不等于-1,就相当于一直在赋值,如果等于了-1,证明字节流中已经没有值了,跳出循环
                        while (bs?.read(byteArray).also {
                                len = it!!
                            } != -1) {
                            //如果有值,就把字节数组写入到文件中
                            os.write(byteArray, 0, len)
                        }
                        //写入完毕,刷新流,确保缓冲区中的所有数据都写入到了文件中
                        os.flush()
                        //关闭流,不关闭会造成内存泄漏
                        os.close()
                        //发送成功,已经下载好文件,所有不需要返回data
                        emit(UIState.OnSuccess("下载成功", StateType.DOWNLOAD))

                    }
                }

            } else {
                emit(UIState.OnError("下载失败:${response.message}"))
            }
        }
    }
}